<?php
/**
 * 分类模型
 * @version 2014102014
 * @author Max.Yu <max@jipu.com>
 */

namespace Home\Model;

use Think\Model;

class CategoryModel extends Model{

  protected $_validate = array(
    array('name', 'require', '标识不能为空', self::EXISTS_VALIDATE, 'regex', self::MODEL_BOTH),
    array('name', '', '标识已经存在', self::VALUE_VALIDATE, 'unique', self::MODEL_BOTH),
    array('title', 'require', '名称不能为空', self::MUST_VALIDATE , 'regex', self::MODEL_BOTH),
  );

  protected $_auto = array(
    array('model', 'arr2str', self::MODEL_BOTH, 'function'),
    array('model', null, self::MODEL_BOTH, 'ignore'),
    array('extend', 'json_encode', self::MODEL_BOTH, 'function'),
    array('extend', null, self::MODEL_BOTH, 'ignore'),
    array('create_time', NOW_TIME, self::MODEL_INSERT),
    array('update_time', NOW_TIME, self::MODEL_BOTH),
    array('status', '1', self::MODEL_BOTH),
  );


  /**
   * 获取分类详细信息
   * @param milit $id 分类ID或标识
   * @param boolean $field 查询字段
   * @return array 分类信息
   * @author Max.Yu <max@jipu.com>
   */
  public function info($id, $field = true){
    //获取分类信息
    $map = array();
    if(is_numeric($id)){ //通过ID查询
      $map['id'] = $id;
    }else{ //通过标识查询
      $map['name'] = $id;
    }
    return $this->field($field)->where($map)->find();
  }

  /**
   * 获取分类树，指定分类则返回指定分类极其子分类，不指定则返回所有分类树
   * @param integer $id 分类ID
   * @param boolean $field 查询字段
   * @return array 分类树
   * @author Max.Yu <max@jipu.com>
   */
  public function getTree($id = 0, $field = true){
    //获取当前分类信息
    if($id){
      $info = $this->info($id);
      $id   = $info['id'];
    }

    //获取所有分类
    $map  = array('status' => 1);
    $list = $this->field($field)->where($map)->order('sort')->select();
    $list = list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_', $root = $id);
    
    //获取返回数据
    if(isset($info)){ //指定分类则返回当前分类极其子分类
      $info['_'] = $list;
    }else{ //否则返回所有分类
      $info = $list;
    }

    return $info;
  }

  /**
   * 获取指定分类的同级分类
   * @param integer $id 分类ID
   * @param boolean $field 查询字段
   * @return array
   * @author Max.Yu <max@jipu.com>         
   */
  public function getSameLevel($id, $field = true){
    $info = $this->info($id, 'pid');
    $map = array('pid' => $info['pid'], 'status' => 1);
    return $this->field($field)->where($map)->order('sort')->select();
  }

  /**
   * 更新分类信息
   * @return boolean 更新状态
   * @author Max.Yu <max@jipu.com>
   */
  public function update(){
    $data = $this->create();
    if(!$data){ //数据对象创建错误
      return false;
    }

    //添加或更新数据
    return empty($data['id']) ? $this->add() : $this->save();
  }

  /**
   * 获取指定分类子分类ID
   * @param string $cate 分类ID
   * @return string id列表
   * @author Max.Yu <max@jipu.com>
   */
  public function getChildrenId($cate){
    $field = 'id,name,pid,title,link_id';
    $category = D('Category')->getTree($cate, $field);
    $ids[]    = $cate;
    foreach ($category['_'] as $key => $value) {
      $ids[] = $value['id'];
    }
    return implode(',', $ids);
  }

  /**
   * 查询后解析扩展信息
   * @param  array $data 分类数据
   * @author Max.Yu <max@jipu.com>
   */
  protected function _after_find(&$data, $options){
    //分割模型
    if(!empty($data['model'])){
      $data['model'] = explode(',', $data['model']);
    }

    //分割文档类型
    if(!empty($data['type'])){
      $data['type'] = explode(',', $data['type']);
    }

    //分割模型
    if(!empty($data['reply_model'])){
      $data['reply_model'] = explode(',', $data['reply_model']);
    }

    //分割文档类型
    if(!empty($data['reply_type'])){
      $data['reply_type'] = explode(',', $data['reply_type']);
    }

    //还原扩展数据
    if(!empty($data['extend'])){
      $data['extend'] = json_decode($data['extend'], true);
    }
  }

}
